package cn.dwy2002.binaryhandwritingserver.service.service;

import cn.dwy2002.binaryhandwritingserver.common.Result;
import cn.dwy2002.binaryhandwritingserver.exception.ProjectNotFoundException;
import cn.dwy2002.binaryhandwritingserver.exception.ServiceException;
import cn.dwy2002.binaryhandwritingserver.pojo.dto.ProjectDTO;
import cn.dwy2002.binaryhandwritingserver.pojo.vo.ProjectVO;

import java.util.List;

/**
 * @author 杜伟毅
 * @version 1.0
 * @since 2025/05/28
 */
public interface ProjectService {
    /**
     * 获取所有有效项目（未被逻辑删除的）
     *
     * @return 项目列表，按创建时间倒序排列
     * @throws ServiceException 当查询失败时抛出
     * @since 2025/5/28 0028 21:31
     */
    Result<List<ProjectVO>> listAllProjects() throws ServiceException;

    /**
     * 根据ID获取项目详情
     *
     * @param id 项目ID
     * @return 项目详情
     * @throws ProjectNotFoundException 当项目不存在时抛出
     * @throws ServiceException         当查询失败时抛出
     * @since 2025/5/28 0028 21:32
     */
    Result<ProjectVO> getProjectDetail(Long id) throws ProjectNotFoundException, ServiceException;

    /**
     * 创建新项目
     *
     * @param dto 项目数据（无需包含ID）
     * @return 创建成功的项目对象（包含生成的ID）
     * @since 2025/5/28 0028 21:33
     */
    Result<Void> createProject(ProjectDTO dto);

    /**
     * 更新项目信息
     *
     * @param dto 项目更新数据（必须包含有效ID）
     * @return 更新后的项目对象
     * @throws ProjectNotFoundException 当项目不存在时抛出
     * @since 2025/5/28 0028 21:34
     */
    Result<Void> updateProject(ProjectDTO dto) throws ProjectNotFoundException;

    /**
     * 删除项目（逻辑删除）
     *
     * @param id 项目ID
     * @throws ProjectNotFoundException 当项目不存在时抛出
     * @since 2025/5/28 0028 21:35
     */
    Result<Void> deleteProject(Long id) throws ProjectNotFoundException;
}